import pandas as pd
import math
import networkx as nx
import os
from parsel import Selector

# 读取包含网页标题和URL的数据
data_frame = pd.read_csv("../data/data.csv", encoding='utf-8', index_col="title")
html_files_path = "../data/data_pages"  # 存放HTML文件的目录路径
html_files = os.listdir(html_files_path)  # 获取目录下所有HTML文件的列表

# 创建一个字典，用于存储每个网页URL及其可以跳转到的其他页面URL列表
link_mapping = {}
total_files = len(html_files)  # 总文件数
processed_files = 0  # 已处理文件数

for html_file in html_files:
    processed_files += 1  # 每处理一个文件，计数器加1
    page_title = str(html_file).split(".html")[0]  # 从文件名中提取页面标题
    # 检查page_title是否是data_frame的有效索引
    if page_title in data_frame.index:
        page_url = data_frame.loc[page_title, 'url']  # 根据页面标题获取对应的URL
        if isinstance(page_url, pd.Series):
            # 如果page_url是Series对象，尝试获取其第一个元素
            page_url = page_url.iloc[0] if not page_url.empty else None
        if page_url is not None:
            file_path = os.path.join(html_files_path, html_file)  # 拼接完整的文件路径
            print(f"正在处理第 {processed_files} 个文件：{html_file}")  # 打印当前处理的文件名和序号
            with open(file_path, 'r', encoding='utf-8-sig') as file:
                content = file.read()
                selector = Selector(content)
                links_on_page = selector.css('a::attr(href)').getall()  # 提取页面中所有的链接
                link_mapping[page_url] = links_on_page  # 将URL和链接列表存入字典
        else:
            print(f"警告：未找到标题为 {page_title} 的URL，跳过此文件。")
    else:
        print(f"警告：标题 {page_title} 不在数据框架的索引中，跳过此文件。")

# 定义计算PageRank的函数
def calculate_page_rank():
    # 创建有向图
    graph = nx.DiGraph()
     # 获取总页面数量
    total_pages = len(link_mapping)
    processed_pages = 0  # 已处理页面计数器

    # 向图中添加边
    for page_url, linked_pages in link_mapping.items():

        processed_pages += 1  # 每处理一个页面，计数器加1
        # 打印当前处理的页面URL
        print(f"正在处理页面 {processed_pages} / {total_pages}：{page_url}")

        for linked_page in linked_pages:
            # 确保linked_page是有效的URL
            if linked_page in data_frame['url'].values:
                graph.add_edge(page_url, linked_page)  # 添加从当前页面到链接页面的边
    # 计算PageRank值
    page_rank_scores = nx.pagerank(graph, alpha=0.85)
    page_rank_series = pd.Series(page_rank_scores, name='page_rank')
    # 对PageRank值进行缩放和范围限制
    page_rank_series = page_rank_series.apply(lambda x: math.log(x * 10000, 10) + 1)
    # 将PageRank值保存到CSV文件
    page_rank_series.to_csv("../data/page_rank.csv", encoding='utf-8-sig')

# 调用函数计算PageRank
calculate_page_rank()

